package sample;

import java.util.ArrayList;

public class Lo {
    public static void main(String args[]) {
        // 实例化
        Array_Put<Integer> arr = new Array_Put<Integer>(3);

        // 添加元素
        arr.Tail_Add(100);
        arr.Tail_Add(101);

        // 获取数组长度
        int l = arr.Len();
        System.out.println(l);

        //设置元素
        arr.Setter(2, 102);

        // 获取对应元素的索引
        int index = arr.IndexOf(102);
        System.out.println(index);

        // 插入元素
        arr.Insert(1,103);
        for(int i=0;i<arr.Len();i++){
            System.out.println(arr.Getter(i));
        }

    }
}

class Array_Put<T> {
    // 声明数组
    private T[] data;
    // 数组元素
    int Element_Number = 0;
    // 初始容量
    int initial_capacity = 0;

    //构造方法,初始化
    public Array_Put(int capacity) {
        data = (T[]) new Object[capacity];
        initial_capacity = capacity;
    }

    // 添加元素
    public void Tail_Add(T t) {
        data[Element_Number] = t;
        Element_Number++;
    }

    // 获取数组长度
    public int Len() {
        return initial_capacity;
    }

    // 获取元素
    public T Getter(int i) {
        if (i < 0 || i > initial_capacity) {
            throw new IllegalArgumentException("索引太长或者索引不能为负数");
        }
        return data[i];
    }

    // 设置元素
    public void Setter(int i, T t) {
        if (i < 0 || i > initial_capacity) {
            throw new IllegalArgumentException("索引太长或者索引不能为负数");
        }
        data[i] = t;
    }

    // 获取对应元素的索引
    public int IndexOf(T t) {
        int i = 0;
        if (data[i] == null) {
            throw new Error("数组第一个元素值不能为null");
        }
        while (i < initial_capacity && data[i] != t) {
            i++;
        }
        if (i < initial_capacity && data[i] == t) {
            return i;
        } else {
            return -1;
        }
    }

    // 插入元素
    public void Insert(int i, T t) {
        Element_Number++;

        Update();

        for (int j = initial_capacity-2; j >= i; j--) {
            data[j+1] = data[j];
        }
        data[i] = t;

    }

    // 更新元素
    public void Update() {

        if (Element_Number == initial_capacity) {
            initial_capacity++;

            T[] new_data = (T[]) new Object[initial_capacity];
            for (int o = 0; o <initial_capacity-1; o++) {
                new_data[o] = data[o];

            }
            data = new_data;
        }
    }


}



